package com.qf.base.listener;

import com.qf.base.domain.BaseCustomer;
import com.qf.base.service.IBaseCustomerService;
import lombok.extern.slf4j.Slf4j;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import java.util.ArrayList;
import java.util.List;

/**
 * --- ONE PIECE ---
 * 客户数据导入监听器（Excel解析）
 *
 * @author yangjiangcheng
 * @date 2025/9/6
 * @desc 用于解析Excel并批量保存客户数据到数据库
 */
@Slf4j // 启用Slf4j注解，可直接使用log对象
public class BaseCustomerDataListener extends AnalysisEventListener<BaseCustomer> {
    /**
     * 每隔5条存储数据库，实际使用中可以100条，然后清理list ，方便内存回收
     */
    private static final int BATCH_COUNT = 5;
    private List<BaseCustomer> cachedDataList = new ArrayList<>();
    /**
     * 客户服务层接口，用于数据库操作
     */
    private IBaseCustomerService baseCustomerService;

    /**
     * 构造方法：注入Spring管理的客户服务对象
     */
    public BaseCustomerDataListener(IBaseCustomerService baseCustomerService) {
        this.baseCustomerService = baseCustomerService;
    }

    /**
     * 每解析一行数据触发一次
     */
    @Override
    public void invoke(BaseCustomer customerData, AnalysisContext context) {
        log.info("解析到一条客户数据:{}", customerData);
        cachedDataList.add(customerData);
        // 达到批处理数量时执行保存
        if (cachedDataList.size() >= BATCH_COUNT) {
            saveData();
            cachedDataList.clear(); // 清空缓存列表，释放内存
        }
    }

    /**
     * 所有数据解析完成后触发
     */
    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
        // 保存剩余未批处理的数据
        saveData();
        log.info("所有客户数据解析完成！");
    }

    /**
     * 批量保存客户数据到数据库
     */
    private void saveData() {
        log.info("{}条客户数据，开始存储数据库！", cachedDataList.size());
        baseCustomerService.insertBatch(cachedDataList); // 调用客户服务的批量插入方法
        log.info("客户数据存储数据库成功！");
    }
}